flutter

flutter 框架开发的 app,打包后,会将代码打包成 so,而且会将接口请求添加证书校验,防止中间人攻击,普通方法是抓不到包的。无形中增加了逆向的难度,说句题外话,用 Flutter 框架开发,不仅可以跨平台,还增加了安全性👍。 Flutter 框架开发的项目,打包后会生成两个 so,分别是 libapp.solibflutter.so,前者是业务相关的,后者是 Flutter 引擎用到的。 用 IDA 打开libapp.so,会发现函数名都被混淆了,这时就要借助开源框架B(l)utter来还原混淆的函数名了。

B(l)utter官网有安装和使用方法,Linux、windows 和 mac 都行

WM-Want2BecomeMagicalGirl.(想要成为马猴烧酒)

jadx打开,查看lib,有flutter.so,典型的flutter思维

直接用blutter,利用blutter_dump出来的文件还原部分字符,还原查看有没有关键词。

搜索app的关键词后,明显能看见这是一个aes加密,加密模式为ecb,在dump下来的pp.txt中就有

但是这个aes加密的密钥是从中另一个so中拉取过来的

这个rc4执行完的结果就是aes的密钥的一部分,全部的密钥还是需要frida来抓,这里使用blutter给的frida脚本抓就行改点参数

1
2
3
4
5
6
7
8
9
10
11
12
function onLibappLoaded() {
// xxx("remove this line and correct the hook value");
const fn_addr = 0x28c6a8;
Interceptor.attach(libapp.add(fn_addr), {
onEnter: function () {
init(this.context);
let objPtr = getArg(this.context, 1);
const [tptr, cls, values] = getTaggedObjectValue(objPtr);
console.log(`${cls.name}@${tptr.toString().slice(2)} =`, JSON.stringify(values, null, 2));
}
});
}

做完这层加密后会发现然后要去java层中做xxtea,但是静态的xxtea和动态执行的不一样,在libnative_add.so中

的.init_proc函数中有一个hook吧xxtea的加密进行更改,sub_1A51C是具体的更改函数

修改:对 指令页v3 = code_item->insnsmprotect 成 RWX,遍历前 0xA0 字节,只对命中的半字动手:

  • 0x??B30x??B2
  • 0x??E00x??E2
    同时把原字节备份到 .data,以便随时回滚。

这里大佬是用动调dump确认的,下面是动调后的更改结果

然后再把加密后的密文进行base64

最终密文可以在pp.txt进行查看